/**
 * File: util.h
 *
 * Funciones y macros de proposito general.
 *
 * Integrantes:
 * @author Jormar Arellano   (05-37840) <jormar.arellano@gmail.com>
 * @author Sabrina Fernández (05-38163) <sabrinamfm@gmail.com>
 */

#ifndef UTIL_H
#define	UTIL_H

#ifdef	__cplusplus
extern "C" {
#endif

#include "arraylist.h"
#include "graph.h"

/** 
 * Archivo del grafo
 */
char* graphFile;

/** 
 * Nivel de verbose a modo general
 */
int _verbose;

/** 
 * Indica si se usan pausas en la ejecucion.
 */
int _steps;

/**
 * Heuristica para resolver el problema.
 */
Graph *(*metaheuristic)(Graph *graph);

/**
 * Calculo de una solucion inicial del grafo.
 * @param	g     grafo
 */
Graph *(*initialSolution)(Graph *g);

/**
 *
 */
char* graphFile;

/**
 * Inicializa todas las variables globales del problema.
 */
void defaults();

/**
 * Valida los argumentos de entrada.
 * @param	argc	Numero de argumentos.
 * @param	argv	Argumentos de entrada.
 */
int validarArgs(int argc, char **argv);

/**
 * Imprime el archivo de ayuda.
 */
void printHelp();

/**
 * Espera al usuario para que presione ENTER con la finalidad
 * de continuar con la ejecucion del programa.
 */
void waitStep();

/** 
 * Crea una lista de numeros consecutivos [1 .. n]
 * @param	n	Tamaño del arreglo.
 * @return	Un arreglo de tamaño n de numeros consecutivos
 */
ArrayList *newNumerationArray(int n);

/** 
 * Borra una lista creada con newNumerationArray()
 * @param	l	Lista creada con newNumerationArray()
 */
void freeNumerationArray(ArrayList *l);

/** 
 * Permuta los elementos de una lista.
 * @param	v	Lista a la cual se le van a permutar los elementos.
 */
void permuteArray(ArrayList *v);

/**
 * Algoritmo greedy que calcula una solucion inicial.
 * @param	graph	Grafo al cual se le aplicara el algoritmo greedy.
 * @return	Un grafo resultado de aplicar el algoritmo greedy.
 */
Graph *iteratedGreedyAlgorithm(Graph *graph);

/**
 * Algoritmo que colorea el grafo con la peor solucion como solucion inicial.
 * @param	graph	Grafo que se coloreara con la peor solucion inicial.
 */
Graph *initialSolution_worst(Graph *graph);

/// Definimos algunas funciones para mostrar informacion de debug
#ifndef ACTIVATE_DEBUG

#define PRINT(s)
#define DEBUG(s,p)
#define DUMPME(s,p)
#define FLAG

#else
#define PRINT(s) \
    printf(s);

#define DEBUG(s,p) \
    printf(s, p);

#define DUMPME(s,p) \
    printf("(%s:%d) %s:" s, __FILE__, __LINE__, #p, p);

#define FLAG \
    printf("%s:%d: FLAG ", __FILE__, __LINE__);

#endif

#ifdef	__cplusplus
}
#endif

#endif
